fontchooser: Use gtk-fontconfig-timestamp setting
authorEmmanuele Bassi <ebassi@gnome.org>
Mon, 4 May 2015 12:25:27 +0000 (13:25 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 5 May 2015 10:22:53 +0000 (11:22 +0100)
We can use the GtkSettings:gtk-fontconfig-timestamp property to decide
whether or not we should reload fonts on style and screen changes. This
should avoid doing a lot of work with large font collections when only
the theme has changed.

https://bugzilla.gnome.org/show_bug.cgi?id=748782

gtk/gtkfontchooserwidget.c

index 5fc82b264a9f5975572c79bbeb25cbb841689265..9e22fbc277afe19e65ca17e9c542846c7edfc876 100644 (file)
@@ -95,6 +95,8 @@ struct _GtkFontChooserWidgetPrivate
   GtkFontFilterFunc filter_func;
   gpointer          filter_data;
   GDestroyNotify    filter_data_destroy;
+
+  guint last_fontconfig_timestamp;
 };
 
 /* This is the initial fixed height and the top padding of the preview entry */
@@ -633,6 +635,21 @@ gtk_font_chooser_widget_load_fonts (GtkFontChooserWidget *fontchooser)
   gint n_families, i;
   PangoFontFamily **families;
   gchar *family_and_face;
+  guint fontconfig_timestamp;
+
+  g_object_get (gtk_widget_get_settings (GTK_WIDGET (fontchooser)),
+                "gtk-fontconfig-timestamp", &fontconfig_timestamp,
+                NULL);
+
+  /* The fontconfig timestamp is only set on systems with fontconfig; every
+   * other platform will set it to 0. For those systems, we fall back to
+   * reloading the fonts every time.
+   */
+  if (fontconfig_timestamp != 0 &&
+      priv->last_fontconfig_timestamp == fontconfig_timestamp)
+    return;
+
+  priv->last_fontconfig_timestamp = fontconfig_timestamp;
 
   list_store = GTK_LIST_STORE (priv->model);